package cn.blogsx.reflect;

import cn.blogsx.domain.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.stream.Stream;

/**
 * 反射的功能：
 *    1.获取成员变量们
 *          * Field[] getFields() 获取所有public修饰的成员变量
 *          * Field getField(String name) 获取指定名称的public修饰的成员变量
 *
 *          * Field[] getDeclaredFields() //获取所有的成员变量
 *          * Field getField(String name)
 *    2.获取构造方法们
 *          * Constructor<?>[] getConstructors()
 *          * Constructor<T> getConstructor(Class<?>... parameterTypes)
 *
 *          * Constructor<?>[] getDeclaredConstructors()
 *          * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
 *
 *    3.获取成员方法们
 *          * Method[] getMethods()
 *          * Method getMethod(String name, Class<?>... parameterTypes)
 *          * Method[] getDeclaredMethods()

 *    4.获取类名
 *          * String getName();
 *
 * Field:成员变量
 *  * 操作：
 *      1、设置值
 *           void set(Object obj, Object value)
 *      2、获取值
 *           Object get(Object obj)
 *      3、忽略访问修饰符的安全检查
 *          字段名setAccessible(true); //暴力反射
 *
 * constructor构造方法
 *      * 创建对象： T newInstance(Object... initargs)
 *       如果使用空参数构造方法创建对象，操作可以简化：Class对象里边的 newInstance
 */
public class Demo03ReflectConstructFunction {
    public static void main(String[] args) throws Exception {

        Class p = Person.class;

        //获取所有的公共构造方法
//        Constructor[] constructors = p.getConstructors();
//        Stream.of(constructors).forEach(System.out::println);

        //获取指定的构造方法
        Constructor constructor1 = p.getConstructor(String.class, int.class);
        System.out.println("name和age的构造方法："+constructor1);
        //使用构造方法创建对象，调用newInstance方法即可
        Object personObj1 = constructor1.newInstance("张三", 20);
        System.out.println(personObj1); //Person{name='张三', age=20, testField1='null'}


        //使用空参构造方法创建对象
        Constructor constructor2 = p.getConstructor();
        //使用空参构造方法创建对象，调用newInstance方法即可
        Object personObj2 = constructor2.newInstance();
        System.out.println(personObj2); //Person{name='null', age=0, testField1='null'}

        //如果使用空参数构造方法创建对象，操作可以简化：Class对象里边的 newInstance
        Object o = p.newInstance();
        System.out.println(o);

    }
}
